# -*- coding: utf-8 -*-
# @project : 《Atcoder》
# @Author : created by bensonrachel on 2021/9/15
# @File : 3.Coin Combinations II.py

modulo = 10**9 + 7

def solve():
    """
    线性DP：二维可优化至一维，一维才能AC，不然会内存溢出
    dp[i][j]代表使用前i（包含i）种硬币能produce出j的方法数。
    dp数组的初始化：使用前n种硬币中任意的硬币能produce出0的方法数为1。（二维）；使用前0种硬币能produce出0的方法数为1。（一维）
    二维：
    1 0 0 0 0 ……
    1
    1
    1
    ·
    ·
    ·
    一维：
    1 0 0 0 0 ……
    ***************************************************
    状态转移方程：
    对于i轮的每一个j，如果就j>=a[i]，dp[i][j]就等于dp[i-1][j](不需要当前a[i]也能produce出j的方法数） + dp[i][j-a[i]](需要使用当前a[i]能produce出j-a[i]的方法数，这种情况里面已经包含了不需要当前a[i]能produce出j-a[i]的方法数）

    对于一维优化，只需要考虑j>=a[i]部分，因为j<a[i]部分不会变，j-a[i]越界了，它直接等于不需要当前a[i]也能produce出j的方法数，也就是上一轮的结果，因为不存在需要使用a[i]produce出j的方法。
    :return: 数组的最后一个元素
    """
    for i in range(1,n+1):
        for j in range(rate[i],x+1):
                dp[j] = (dp[j] + dp[j-rate[i]])%modulo
    return dp[-1]%modulo

"""
题意：
For example, if the coins are {2,3,5} and the desired sum is 9, there are 3 ways:
2+2+5
3+3+3
2+2+2+3
"""
if __name__ == '__main__':
    n,x = map(int ,input().split())
    rate = [int(i) for i in input().split()]
    rate = [0] + rate
    dp = [0]*(x+1)
    dp[0] = 1#初始化
    ans = solve()
    print(ans)


# 二维做法。⬇
# # -*- coding: utf-8 -*-
# # @project : 《Atcoder》
# # @Author : created by bensonrachel on 2021/9/15
# # @File : 3.Coin Combinations II.py
#
# modulo = 10**9 + 7
#
# def solve():
#     for i in range(1,n+1):
#         for j in range(1,x+1):
#             if(j<rate[i]):
#                 dp[i][j] = dp[i-1][j]%modulo
#             else:
#                 dp[i][j] = (dp[i-1][j] + dp[i][j-rate[i]])%modulo
#     return dp[-1][-1]%modulo
#
#
# if __name__ == '__main__':
#     n,x = map(int ,input().split())
#     rate = [int(i) for i in input().split()]
#     rate = [0] + rate
#     dp = [[0]*(x+1) for i in range(n+1)]
#     for i in range(n+1):
#         dp[i][0] = 1
#     ans = solve()
#     print(ans)